package com.planesnet.sqlite2.ui;

import java.util.List;
import java.util.Random;

import com.planesnet.sqlite2.Actividad;
import com.planesnet.sqlite2.Constants;
import com.planesnet.sqlite2.R;
import com.planesnet.sqlite2.db.ActividadDB;

import android.app.ListActivity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.Toast;

public class SQLite2Activity extends ListActivity {
	private static int DETAIL_ACTIVITY = 1;
	private ActividadDB datasource;
	@SuppressWarnings("unchecked")
	private ArrayAdapter<Actividad> adapter;
	private int selectedPosition;

	private ActionMode actionMode;
	private ActionMode.Callback actionModeCallback = new ActionMode.Callback() {

		// Called when the action mode is created; startActionMode() was
		// called
		@Override
		public boolean onCreateActionMode(ActionMode mode, Menu menu) {
			// Inflate a menu resource providing context menu items
			MenuInflater inflater = mode.getMenuInflater();
			inflater.inflate(R.menu.contextual_menu_for_items, menu);
			return true;
		}

		// Called each time the action mode is shown. Always called after
		// onCreateActionMode, but
		// may be called multiple times if the mode is invalidated.
		@Override
		public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
			return false; // Return false if nothing is done
		}

		// Called when the user selects a contextual menu item
		@Override
		public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

			int id = item.getItemId();
			return processOption(id);
		}

		// Called when the user exits the action mode
		@Override
		public void onDestroyActionMode(ActionMode mode) {
			actionMode = null;
		}
	};

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.sqlite2);

		datasource = new ActividadDB(this);
		datasource.open();

		List<Actividad> values = datasource.getActividades();

		// Use the SimpleCursorAdapter to show the
		// elements in a ListView
		adapter = new ArrayAdapter<Actividad>(this,
				android.R.layout.simple_list_item_1, values);
		setListAdapter(adapter);

		// Modificar el comportamiento de la lista.
		ListView lv = getListView();
		lv.setTextFilterEnabled(true);
		lv.setLongClickable(true);

		lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
			// Called when the user long-clicks on someView
			@Override
			public boolean onItemLongClick(AdapterView<?> parent, View view,
					int position, long id) {
				Log.d(Constants.DEBUG_TAG, "Long click detected.");
				if (actionMode != null) {
					return false;
				}

				view.setSelected(true);
				selectedPosition = position;

				// Start the CAB using the ActionMode.Callback defined above
				actionMode =  startActionMode(actionModeCallback);
				return false;
			}
		});

	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Añadir el menú de opciones a la pantalla principal.
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.sqlite2_menu, menu);
		return true;
	}

	/**
	 * En función de la opción seleccionada en el Action Bar o el menú,
	 * ejecutamos la opción.
	 */
	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		int id = item.getItemId();
		return processOption(id);
	}

	@Override
	protected void onResume() {
		datasource.open();
		super.onResume();
	}

	@Override
	protected void onPause() {
		datasource.close();
		super.onPause();

	}

	/**
	 * Ejecutar la opción seleccionada en el Action Bar.
	 * 
	 * @param id
	 * @return Si se ha ejecutado alguna opción.
	 */
	public boolean processOption(int id) {
		switch (id) {
		case android.R.id.home:
			return true;

		case R.id.item_new:
			newdata();
			return true;
		case R.id.item_edit:
			edit();
			
			return true;
		case R.id.item_discard:
			delete();
			return true;
		}
		return false;
	}

	// Nuevo dato.
	private void newdata() {
		startDetailActivity(R.id.item_new, null);

	}

	// Editar el nombre.
	private void edit() {
		Actividad actividad = null;
		if (selectedPosition >= 0) {
			Log.d(Constants.DEBUG_TAG, "Position to edit " + selectedPosition);
			actividad = (Actividad) getListAdapter().getItem(selectedPosition);
			selectedPosition = -1;
			actionMode.finish();
			startDetailActivity(R.id.item_edit, actividad);
		}
	}

	// Borrar el elemento seleccionado.
	private void delete() {
		Actividad actividad = null;
		if (selectedPosition >= 0) {
			Log.d(Constants.DEBUG_TAG, "Position to delete " + selectedPosition);
			actividad = (Actividad) getListAdapter().getItem(selectedPosition);
			datasource.delete(actividad);
			adapter.remove(actividad);
			adapter.notifyDataSetChanged();
			selectedPosition = -1;
			actionMode.finish();
		}

	}

	// Iniciar la edición de datos con la opción de menú seleccionada.
	private void startDetailActivity(int itemId, Actividad actividad) {
		Intent intent = new Intent(this, DetailActivity.class);
		intent.putExtra("itemId", itemId);

		// Si es edición, pasamos el nombre a la actividad de edición.
		if (itemId == R.id.item_edit) {
			intent.putExtra("id", actividad.getId());
			intent.putExtra("nombre", actividad.getNombre());
		}

		startActivityForResult(intent, DETAIL_ACTIVITY);
	}

	
	// Controlar el resultado después de la edición.
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {

		if (requestCode == DETAIL_ACTIVITY) {

			if (resultCode == RESULT_OK) {
				datasource = new ActividadDB(this);
				datasource.open();

				List<Actividad> values = datasource.getActividades();

				// Use the SimpleCursorAdapter to show the
				// elements in a ListView
				adapter = new ArrayAdapter<Actividad>(this,
						android.R.layout.simple_list_item_1, values);
				setListAdapter(adapter);

			} else if (resultCode == RESULT_CANCELED) {
				// Write your code on no result return
			}
		}
	}

	// Mostrar datos
	private void makeToast(String message) {
		Toast.makeText(this, message, Toast.LENGTH_SHORT).show();
	}

}